/**
 * @file UI.h
 * @brief 底盘UI交互模块头文件，定义UI元素类型、操作命令及数据结构
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-08
 * 
 * @copyright Copyright (c) 2025  邱伟凡
 * 
 * @par 修改日志:
 *   - 2025-08-08: 初始版本创建
 * @bug 待解决问题:
 *   
 */
#ifndef UI_H
#define UI_H
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "QWF_Type.h"
#pragma pack(1)//1字节对齐
// 图形元素总个数，每个图形元素需要吃掉16字节内存，请根据自身具体需要修改
#define ui_data_num 26  ///< 图形元素总个数（每个元素占用16字节内存，根据实际需求调整）
#define ui_err_id	uin32_t_max  ///< UI元素错误ID（表示无效的图形ID）
typedef struct {
	struct{
		uint32_t chassis;
		uint32_t gimbal;
		uint32_t fire;
		uint32_t vision;
		uint32_t power;
	}mode_txt;
	struct{
	uint32_t scope;
	uint32_t sight;
	uint32_t vision_distance;
	}fire;
	uint32_t HP[7][2];
	struct{
	uint32_t Gimbal;
	uint32_t Board[4];
//	uint32_t num[4];
	}my_car;
	struct{
//	uint32_t now;
//	uint32_t max;
	uint32_t num;	
	}super_elec;
//	struct{
//		struct{
//			uint32_t text;
//			uint32_t num;		
//		}w_top;
//		struct{
//			uint32_t text;
//			uint32_t num;		
//		}v_fire;		
//	}change;
}my_ui_id;
extern my_ui_id* my_ui;
typedef enum {
	//0x200-0x02ff 	队伍自定义命令 格式  INTERACT_ID_XXXX
	INTERACT_ID_delete_graphic = 0x0100,	///< 客户端删除图形命令ID
	INTERACT_ID_draw_one_graphic = 0x0101,	///< 客户端绘制1个图形命令ID
	INTERACT_ID_draw_two_graphic = 0x0102,	///< 客户端绘制2个图形命令ID
	INTERACT_ID_draw_five_graphic = 0x0103,	///< 客户端绘制5个图形命令ID
	INTERACT_ID_draw_seven_graphic = 0x0104,	///< 客户端绘制7个图形命令ID
	INTERACT_ID_draw_char_graphic = 0x0110,	///< 客户端绘制字符图形命令ID
	INTERACT_ID_bigbome_num = 0x02ff
}client_act;  ///< 客户端与裁判系统交互的命令ID枚举
typedef enum {
	UiLine = 0,       ///< 直线图形类型
	UiRect,           ///< 矩形图形类型
	UiCircle,         ///< 圆形图形类型
	UiEllipse,        ///< 椭圆图形类型
	UiArc,            ///< 圆弧图形类型
	UiFloat,          ///< 浮点数值显示类型
	UiInt,            ///< 整数值显示类型
	UiStr,            ///< 字符串显示类型
} ui_type;  ///< 发送数据的图形/显示类型枚举
typedef enum {
	UiTeam = 0,       ///< 队伍默认颜色（根据阵营自动切换）
	UiYellow,        ///< 黄色
	UiGreen,         ///< 绿色
	UiOrange,        ///< 橙色
	UiMagenta,       ///< 品红色
	UiPink,          ///< 粉色
	UiCyan,          ///< 青色
	UiBlack,         ///< 黑色
	UiWhite,         ///< 白色
}ui_color;  ///< 图形/文本显示颜色枚举
typedef enum {//进行的操作
	UiOpNoop,
	UiOpAdd,
	UiOpModify,
	UiOpDelete,
}ui_act;
enum UiidErrorCode
{
	UiNoMoreSpace = in32_t_max,
	UiMutexTimeout = in32_t_max - 1,
};
typedef uint32_t ui_id;
typedef ui_id(*ui_create)(int width, ui_color color, int layer, int x1, int y1, int x2, int y2);
typedef struct {
	struct {										/*宽度*/	/*颜色*/		/*层*/
		ui_id(*line)/*直线*/					(int width, ui_color color, int layer, \
			int x1, int y1, int x2, int y2);
		ui_id(*rect)/*矩形*/					(int width, ui_color color, int layer, \
			int x1, int y1, int x2, int y2);
		ui_id(*circle)/*圆形*/					(int width, ui_color color, int layer, \
			int x, int y, int r);
		ui_id(*ellipse)/*椭圆*/				(int width, ui_color color, int layer, \
			int x, int y, int xSemiaxis, int ySemiaxis);
		ui_id(*arc)/*圆弧*/					(int width, ui_color color, int layer, \
			int x, int y, int xSemiaxis, int ySemiaxis, int startAngle, int endAngle);
		ui_id(*string)/*只有字符串*/			(int width, ui_color color, int layer, \
			int x, int y, int fontSize, const char* str);
		ui_id(*float_only)/*只有单浮点*/		(int width, ui_color color, int layer, \
			int x, int y, int fontSize, float value);//内部自带*1000
		ui_id(*int_only)/*只有整形*/			(int width, ui_color color, int layer, \
			int x, int y, int fontSize, int value);
		ui_id(*float_int)/*单浮点+整形*/		(int width, ui_color color, int layer, \
			int x, int y, int fontSize, int value);//内部自带*1000
	}create;//创造ui所需的东西
	struct {
		void (*visible)/*可见性*/			(ui_id id, _Bool visible);
		void (*color)/*颜色*/	 			(ui_id id, ui_color color);
		void (*width)/*宽度*/	 			(ui_id id, int fontSize);
		void (*font_size)/*图像型字体大小*/	(ui_id id, int fontSize);
		void (*xy1)	/*修改坐标(前两个)*/	(ui_id id, int x, int y);
		void (*xy2)/*修改坐标(后两个)*/		(ui_id id, int x, int y);
		void (*r)/*修改半径*/				(ui_id id, int r);
		void (*semiaxis)/*半轴*/			(ui_id id, int xSemiaxis, int ySemiaxis);
		void (*start_angle)	/*起始角度*/	(ui_id id, int startAngle);
		void (*end_angle)   /*终止角度*/	(ui_id id, int endAngle);
		void (*float_only)	/*只有单浮点*/  (ui_id id, float value);
		void (*float_int)   /*单浮点+整形*/ (ui_id id, int value);
		void (*int_only)    /*只有整形*/    (ui_id id, int value);
		void (*str)      /*字符串*/      	(ui_id id, const char* str);
		void (*str_len)  /*字符串长度*/  	(ui_id id, const char* str, int length);

	}set;//修改图像属性
	struct {
		void (*only)/*删除特定id的图像*/(ui_id id);
		void (*all)/*删除全部图像*/(void);
	}delet;//删除
	struct {
		void (*string)/*字符*/(uint32_t index, ui_act op);
		void (*other)/*其余的*/(size_t count);
	}transmit;//发送
}ui_cmd_t;//ui命令
extern ui_cmd_t* ui_cmd;
// 【用户需要在使用库前调用此函数进行初始化】
// 设置JLUI使用的互斥锁对象的指针。
//void JLUI_SetMutexObject(void *mutex);

// 【用户需要在使用库前调用此函数进行初始化】
// 设置交互数据包的发送者ID和接收者ID。此函数同时会初始化其他需要单次初始化的包缓冲区字段，
// 以及清空图形缓冲区进行初始化，所以使用任何其他功能前必须调用！！
//void JLUI_SetSenderReceiverId(uint16_t senderId, uint16_t receiverId);

// 获取所有已占用的图形个数
//void JLUI_GetTotalObjectCount();

// 标记字符串已改变
//void JLUI_SetStringChanged(Uiid id);


// ================================================================================================
//     私有数据结构
// ================================================================================================
typedef __packed struct {//发送出去给裁判系统的
	// 包头
	uint8_t SOF;
	uint16_t DataLength;
	uint8_t Seq;
	uint8_t Crc8;
	// 命令ID
	uint16_t CommandId;
	// 数据段包结构的头
	uint16_t ContentId;
	uint16_t SenderId;
	uint16_t ReceiverId;
} ui_tx_head_t;
typedef struct {
	char name[3];
	union {
		uint32_t data;
		struct
		{
			uint32_t operation : 3; ///< 图形操作类型
			uint32_t not_used : 29; ///< 未使用
		} detailDword1Internal;
	}detailDword1;
	uint32_t detailDword2;
	uint32_t detailDword3;
} ui_tx_ui_obj;
typedef struct {//图形
	//图像对象元数据
	struct {//自定义的，不用发
		bool valid : 1; ///< 置位时表示此图形项有效。图形项被删除时不会清空，而是在下次Tick时清空。
		bool deleted : 1; ///< 置位时表示此图形项等待删除。该图形项下次被Tick时将被移除。
		bool dirty : 1;           ///< 已被修改位。如置位，下次Tick时会被更新。
		bool dirtyVisibility : 1; ///< 可见性已被修改位，如置位，下次Tick时会被创建/删除
		bool visible : 1; ///< 可见性位，图形可见时为1，不可见时为0。
		///< 此位需要和dirtyVisibility配合使用。
	} meta;//用于互斥判断（防堵塞/dma发送不完全）	
	/*前几位都一样*/
	uint8_t name[3];//发送时使用ui_data[i].name发送 
	/*除掉名字100bit*/
	union {
		uint32_t data;
		__packed struct {
			uint32_t operate : 3;  // [内存中未使用] 图形操作
			uint32_t type : 3; //类型 ui_type
			uint32_t layer : 4;        //层0-9，错误会归0
			uint32_t color : 4; 		//颜色 ui_color
			uint32_t detailA : 9;///< （圆弧）起始角度/（文本）字体大小
			uint32_t detailB : 9;///< （圆弧）终止角度/（字符串）长度
		}pack;
	}word1;
	union {
		uint32_t data;
		struct {
			uint32_t width : 10;//宽度 
			uint32_t x : 11;//第一个x
			uint32_t y : 11;//第一个y
		}pack;
	}word2;
	union {
		uint32_t data;
		uint32_t float_val;//浮点数据
		uint32_t int_val;  //整形数据
		const char* str_val;	//字符数据
		struct {
			uint32_t radius : 10; // 正圆半径
			uint32_t reserved : 22;//保留
		}pack_circle;//圆形
		struct {
			uint32_t reserved : 10;
			uint32_t x2 : 11; // 第二个x坐标
			uint32_t y2 : 11; // 第二个y坐标
		}pack_line;//直线
		struct {
			uint32_t reserved : 10;
			uint32_t x2 : 11; // 第二个x坐标
			uint32_t y2 : 11; // 第二个y坐标
		}pack_rect;//矩形		
		struct {
			uint32_t reserved : 10;	 //保留
			uint32_t xSemiaxis : 11; // x半轴长度
			uint32_t ySemiaxis : 11; // y半轴长度
		}pack_ellipse;//椭圆		
	}word3;
} UI_Data_t;
/*

//UI
typedef __packed struct{//UI(PDF P25）
	uint16_t data_cmd_id;				//子内容 ID
	uint16_t sender_id;					//发送者 ID 
	uint16_t receiver_id;				//接收者 ID
	uint8_t user_data[user_data_lenth]; //内容数据段
}robot_interaction_data_t;

typedef __packed struct{//UI删除图层
	uint8_t delete_type;//删除操作		0空操作 1删除图层 2删除所有
	uint8_t layer;		//图层数		0~9
}interaction_layer_delete_t;

typedef __packed struct{//UI操作
	uint8_t figure_name[3];
	uint32_t operate_tpye:3;
	uint32_t figure_tpye:3;
	uint32_t layer:4;
	uint32_t color:4;
	uint32_t details_a:9;
	uint32_t details_b:9;
	uint32_t width:10;
	
	uint32_t start_x:11;
	uint32_t start_y:11;
	uint32_t details_c:10;
	uint32_t details_d:11;
	uint32_t details_e:11;
}interaction_figure_t;
typedef __packed struct{//UI图形细节1，2
	interaction_figure_t interaction_figure[2];
}interaction_figure_2_t;

typedef __packed struct{//UI图形细节3
	interaction_figure_t interaction_figure[5];
}interaction_figure_3_t;

typedef __packed struct{//UI图形细节4
	interaction_figure_t interaction_figure[7];
}interaction_figure_4_t;

typedef __packed struct{//UI client
//	graphic_data_struct_t grapic_data_struct;
	uint8_t data[30];
} ext_client_custom_character_t;

*/
void JLUI_SetSenderReceiverId(uint16_t senderId, uint16_t receiverId);
//UI_Data_t ui_data[ui_data_num];//图像列表
//static uint8_t	ui_tx_buffer[120];
#endif
